// 版权所有2009年围棋作者。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package gob

import "fmt"

// 解码和编码中的错误使用panic和recover进行处理。
// 用户错误引起的恐慌（即，除运行时恐慌外的所有情况）
// 例如“索引超出范围”错误）不要离开导致
// 但是，它们被转换为纯错误返回。编码和
// 不返回错误的解码函数和方法也可以使用
// 紧急报告错误或保证无错误。

// gobError用于区分此包中生成的错误（恐慌）。
type gobError struct {
	err error
}

// errorf与error_u类似，但采用Printf样式的参数来构造错误。
// 它总是在消息的前面加上“gob:”。
func errorf(format string, args ...interface{}) {
	error_(fmt.Errorf("gob: "+format, args...))
}

// error包装参数error，并将其用作参数以防死机。
func error_(err error) {
	panic(gobError{err})
}

// catchError是一个延迟函数，用于将恐慌（gobError）转化为错误
// 完全错误。它覆盖延迟其调用的函数的错误返回。
func catchError(err *error) {
	if e := recover(); e != nil {
		ge, ok := e.(gobError)
		if !ok {
			panic(e)
		}
		*err = ge.err
	}
}
